//配置路由的地方
import Vue from 'vue';
import VueRouter from 'vue-router';
//引入路由配置
import routes from './routes';
//使用路由插件
Vue.use(VueRouter);
//引入store
import store from '@/store';

//先把VueRouter原型对象的push和replace保存一份
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;

/** 重写push|replace
 * params：
 *  location：告诉原来的push函数往哪里跳转(传递哪些参数)
 *  resolve：成功的回调
 *  reject：失败的回调
 */
VueRouter.prototype.push = function(location,resolve,reject){
    //函数上下文为VueRouter类的一个实例,这里this指向的是push函数的调用者,也就是VueRouter实例
    if(resolve && reject){//如果传了成功和失败的回调,就是直接使用
        //将this指向指回VueRouter实例
        originPush.call(this,location,resolve,reject);
    }else{//如果没有传递成功或失败的回调,就默认传递一个
        originPush.call(this,location,()=>{},()=>{});
    }
}
VueRouter.prototype.replace = function(location,resolve,reject){
    if(resolve && reject){
        originReplace.call(this,location,resolve,reject);
    }else{
        originReplace.call(this,location,()=>{},()=>{});
    }
}


//配置路由
let router = new VueRouter({
    //配置路由
    routes,
    //滚动行为
    scrollBehavior(to,from,savePosition){
        //返回的这个y=0，代表的滚动条在最上面
        return {y: 0};
    }
})


//全局守卫：全局前置守卫(在路由跳转之前进行判断)
router.beforeEach(async(to,from,next)=>{
    //next的写法：next()；next('放行到指定的路由')；next(false)
    //从仓库中获取token----确定用户已经登录了
    let token = store.state.user.token;
    //获取用户信息，再次刷新页面的时候，如果没有名字就再次发送请求获取用户信息
    let name = store.state.user.userInfo.name;
    //用户登录已经登录了
    if (token) {
        //用户已经登录的就不能去login和register页面了，只能停在首页
        if (to.path=='/login'||to.path=='/register') {
            next('/home');
        }else{
            //登录的，但是去的不是login
            if (name) {//如果用户名已有
                next();
            } else {//没有用户信息派发action让仓库存储用户信息再跳转
                try {
                    //在路由跳转之前获取用户信息再放行
                    await store.dispatch('getUserInfo');
                    next();
                } catch (error) {
                    //token失效了获取不到用户信息，清除token
                    await store.dispatch('userLogout');
                    next('/login');
                }
            }
            next();
        }
    } else {
        //要去的路由
        let toPath = to.path;
        if (toPath.indexOf('/trade')!=-1||toPath.indexOf('/pay')!=-1||toPath.indexOf('/center')!=-1) {//未登录：不能访问交易相关、支付相关、用户中心相关,跳转到登录页面
            next('/login?redirect='+toPath);//携带一个query参数，在登录页面进行判断，标识登录之后要跳转到的路由
        } else {//登录了就放行
            next();
        }
    }
})



export default router;